package onlinelog

import (
	"fmt"
	"strconv"
	"time"

	"7qule.com/sd3/CrossServer/src/config"
	"github.com/elastic/go-elasticsearch/v8"
	"public.com/goutil/logUtil"
	"public.com/goutil/stringUtil"
	"public.com/goutil/webUtil"
)

// 日志对象
type LogInfo struct {
	// 日志类型
	LogType string

	// 日志消息
	Message string

	// 程序标识
	InnerId string

	// 数据库连接字符串
	ConnectionStr string

	// 日志事件
	CrTime time.Time
}

var (
	es      *elasticsearch.Client
	crossId string
)

func init() {
	if stringUtil.IsEmpty(config.EsUrls) {
		panic("必须配置es地址")
	}

	urls := stringUtil.Split(config.EsUrls, []string{","})
	transport := webUtil.NewTransport()
	transport.DisableKeepAlives = true
	ess, err := elasticsearch.NewClient(elasticsearch.Config{
		Addresses: urls,
		Transport: transport,
	})
	if err != nil {
		panic(fmt.Sprintf("构造es对象出错，err:%s", err.Error()))
	}

	es = ess
	crossId = strconv.Itoa(config.CrossServerId)
}

// 信息日志记录
// format:日志格式
// args:参数列表
func InfoLog(format string, args ...interface{}) {
	info := buildOnlinInfo("Info", format, args...)
	logUtil.InfoLog(info.Message)
	writeOnline(info)
}

// 错误日志记录
// format:日志格式
// args:参数列表
func WarnLog(format string, args ...interface{}) {
	info := buildOnlinInfo("Warn", format, args...)
	logUtil.WarnLog(info.Message)
	writeOnline(info)
}

// 调试日志记录
// format:日志格式
// args:参数列表
func DebugLog(format string, args ...interface{}) {
	info := buildOnlinInfo("Debug", format, args...)
	logUtil.DebugLog(info.Message)
	writeOnline(info)
}

// 警告日志记录
// format:日志格式
// args:参数列表
func ErrorLog(format string, args ...interface{}) {
	info := buildOnlinInfo("Error", format, args...)
	logUtil.ErrorLog(info.Message)
	writeOnline(info)
}

// 致命错误日志记录
// format:日志格式
// args:参数列表
func FatalLog(format string, args ...interface{}) {
	info := buildOnlinInfo("Fatal", format, args...)
	logUtil.FatalLog(info.Message)
	writeOnline(info)
}

// 写入在线日志
func writeOnline(info *LogInfo) {
	if config.DEBUG {
		return
	}

	//序列化
	// bb, err := json.Marshal(info)
	// if err != nil {
	// 	logUtil.ErrorLog("反序列化失败：%s", err.Error())
	// 	return
	// }

	// //写入对应在线日志
	// res, err := es.Index(
	// 	"cros_log",
	// 	bytes.NewBuffer(bb),
	// 	es.Index.WithRefresh("true"),
	// )
	// if err != nil {
	// 	logUtil.ErrorLog("online error:%s", err)
	// 	return
	// }
	// defer res.Body.Close()

	logUtil.LogAndPrint(info.Message, logUtil.Fatal)
}

// 组装在线日志对象
func buildOnlinInfo(logType, format string, args ...interface{}) *LogInfo {
	connectionStr := config.GetDbConfig().GetGameConfig().ConnectionString
	msg := format
	if len(args) > 0 {
		msg = fmt.Sprintf(format, args...)
	}
	info := &LogInfo{
		LogType:       logType,
		Message:       msg,
		InnerId:       crossId,
		ConnectionStr: connectionStr,
		CrTime:        time.Now(),
	}

	return info
}
